package sudoku.server.dominio;
import java.rmi.RemoteException;
import java.util.Enumeration;
import java.util.Hashtable;

import sudoku.client.comunicaciones.IJugador;
import sudoku.server.comunicaciones.Notificador;
import sudoku.server.comunicaciones.StubJugador;
import sudoku.server.persistencia.FachadaPersistencia;
import sudoku.server.persistencia.TableroDAO;
import sudoku.server.presen.JFServer;
import sudoku.server.comunicaciones.Notificador;



public abstract class Tablero{
	protected int id;
	protected Hashtable<String, StubJugador> jugadores;
	private JFServer ventana;
	protected TableroDAO dao;
	public abstract void poner (byte idCuadricula, byte fila, byte columna, byte numero) throws RemoteException;
	public abstract void quitar(byte idCuadricula, byte fila, byte columna) throws RemoteException;
	public abstract void setNumeros(String ristra);
	public abstract String toString();
	public abstract void insert() throws Exception;
	protected abstract void update() throws RemoteException;
	

	
	protected void notificar() throws RemoteException {
		Enumeration<StubJugador> e=this.jugadores.elements();
		while (e.hasMoreElements()) {
			try {
				StubJugador jugador=e.nextElement();
				Notificador n=new Notificador(this, jugador);
				Thread t=new Thread(n);
				t.start();
			}
			catch (Exception ex) {
			}
		}
	}

	public void add(IJugador jugador, String idJugador) {
		StubJugador stubJugador=new StubJugador(jugador, idJugador);
		this.jugadores.put(idJugador, stubJugador);
	}
	
	public int getId(){
		return id;
	}

	public void setId(int id) {
		this.id=id;
	}

	public void crearVectorDeJugadores() {
		this.jugadores=new Hashtable<String, StubJugador>();
	}

	public String getRistra() {
		return this.toString();
	}
	
	public synchronized void removeJugador(String id) {
		this.jugadores.remove(id);
		this.ventana.logError("Se ha eliminado a " + id + " del sudoku " + this.id + ", que no contestaba");
	}
	
	public StubJugador findJugador(String idJugador) {
		return this.jugadores.get(idJugador);
	}
	public void setVentana(JFServer ventana) {
		this.ventana=ventana;
	}
	
	public Tablero() {}
}